#pragma once
namespace my_list{
	//节点类
	template <class T>
	struct list_node
	{
		list_node* _next;
		list_node* _prev;
		T _data;
		list_node(const T& val)
			:_next(nullptr)
			,_prev(nullptr)
			,_data(val)
		{}
	};
	//迭代器类 -->封装
	template <class T>
	struct __list_iterator
	{
		typedef list_node<T> node;
		node* _pnode;
		__list_iterator(node* p)
			:_pnode(p)
		{}
		//对于迭代器而言，需要重载*
		T& operator*()
		{
			return _pnode->_data;
		}
		__list_iterator<T>& operator++()
		{
		
			_pnode = _pnode->_next;
			return *this;
		}
		bool operator!=(const __list_iterator<T>& t)
		{
			return _pnode != t._pnode;
		}
	};
	template <class T>
	class list
	{
		typedef list_node<T> node;
	public:
		typedef  __list_iterator<T> iterator;

		iterator begin()
		{
			return iterator(_head->_next); //匿名对象
		}
		iterator end()
		{
			return iterator(_head); //匿名对象
		}
		list()
		{
			_head = new node(T());
			_head->_next = _head;
			_head->_prev = _head;
		}
		~list()
		{
		}

		void push_back(const T& val)
		{
			node* newnode = new node(val);
			node* tail = _head->_prev;
			//改变节点关系
			newnode->_prev = tail;
			tail->_next = newnode;
			_head->_prev = newnode;
			newnode->_next = _head;
		
		}
	private:
		node* _head;
	};
	void test_list()
	{
		list<int> li;
		li.push_back(1);
		li.push_back(2);
		li.push_back(3);
		li.push_back(4);
		list<int>::iterator it = li.begin();
		//所有迭代器都是类的内嵌类型
		while (it != li.end()) //这儿一般不使用<，因为List的本质是双向链表，内存不是连续的，所以string和vector建议也使用!=
		{
			cout << *it << " ";
			++it;
		}
		cout << endl;


	}










}